// #pragma once
// #include <arpa/inet.h>
// #include <sys/types.h>
// #include <sys/socket.h>
// #include <string>
// #include <netinet/in.h>
// #include<cstring>
// #include"InetAddr.hpp"
// #include"Dict.hpp"
// class UdpServer
// {
// public:
//     UdpServer(int fd, u_int16_t port)
//         : _sockfd(fd),
//         //  _ip(ip),
//           _port(port)
//     {
//     }

//     void Init() // 初始化
//     {
//         _sockfd = socket(AF_INET, SOCK_DGRAM, 0); // 创建文件描述符
//         if (_sockfd < 0)
//         {
//             perror("socket fail");
//             exit(1);//创建失败不需要继续运行了
//         }
//         //说明创建成功,
//         //打印一下
//         printf("socket success\n");
//         //需要进行主机序列转网络序列,放入结构体中
//         struct sockaddr_in local;
//         std::memset(&local,0,sizeof(local));//进行清零工作
//         local.sin_family=AF_INET;
//         local.sin_port=htons(_port);
//         local.sin_addr.s_addr= INADDR_ANY;
//         //已经从主机转到网络系列了，该绑定了
//         int n=bind(_sockfd, (struct sockaddr*)&local,sizeof(local));
//         if(n<0)
//         {
//             perror("bind fail\n");
//             exit(2);
//         }
//         printf("bind success\n");

       

//     }
//     //编写运行接口
//     std::string fun(std::string word,Dict*dict,InetAddr&client)
//     {
//         std::cout<<dict->Translate(word,client)<<std::endl;
//        return  dict->Translate(word,client);

//     }
//     void Start(Dict*dict)
//     {
//         //在服务器端口应该是先接收，处理后发送
//         while(1)
//         {
//             char buffer[1024];
//             struct sockaddr_in peer;
//            socklen_t len=sizeof(peer);
//            ssize_t n=recvfrom(_sockfd,buffer,sizeof(buffer)-1,0,(struct sockaddr*)&peer,&len);
//            if(n>0)
//            {
//             buffer[n]=0;
//             //接收到了信息,苹果
//              InetAddr client(peer);
//             std::cout<<buffer<<std::endl;
//             std::string result=fun(buffer,dict,client);
//             result+=buffer;
//             sendto(_sockfd,result.c_str(),result.size(),0,(sockaddr*)&peer,len);
//            }
//         }
//     }
//     ~UdpServer() {}

// private:
//     int _sockfd; // 创建它的文件描述符
//     // ip
//   //  std::string _ip;
//     // 端口号
//     u_int16_t _port;
// };

#pragma once
#include "Dict.hpp"
#include "InetAddr.hpp"
#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

class UdpServer {
public:
    UdpServer(uint16_t port) : _port(port) {
        _sockfd = -1; // 初始化文件描述符
    }

    ~UdpServer() {
        if (_sockfd != -1) {
            close(_sockfd);
        }
    }

    bool Init() {
        _sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        if (_sockfd < 0) {
            perror("socket failed");
            return false;
        }

        struct sockaddr_in local;
        memset(&local, 0, sizeof(local));
        local.sin_family = AF_INET;
        local.sin_port = htons(_port);
        local.sin_addr.s_addr = INADDR_ANY;

        if (bind(_sockfd, (struct sockaddr*)&local, sizeof(local)) < 0) {
            perror("bind failed");
            close(_sockfd);
            return false;
        }

        std::cout << "Server initialized on port " << _port << std::endl;
        return true;
    }

    void Start(Dict* dict) {
        if (!dict) {
            std::cerr << "Dictionary is null!" << std::endl;
            return;
        }

        while (true) {
            char buffer[1024];
            struct sockaddr_in peer;
            socklen_t len = sizeof(peer);

            ssize_t n = recvfrom(_sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&peer, &len);
if (n > 0) {
    
                buffer[n] = '\0';
                std::cout<<buffer<<std::endl;
                InetAddr client(peer);

                std::string word(buffer);
                std::string result = dict->Translate(word, client);

                sendto(_sockfd, result.c_str(), result.size(), 0, (struct sockaddr*)&peer, len);
            }
        }
    }

private:
    int _sockfd;
    uint16_t _port;
};